
// 普通函数和箭头函数的this指向：

// （1）若是全局函数，并且没有直接调用它的对象，没有严格模式，则默认指向全局 window
function hello1(){
    console.log('我是hello1 this:',this) // window
}
hello1()  

// （2）若是全局函数，并且没有直接调用的对象，严格模式下，this指向undefined
function hello2(){
    'use strike';
    console.log('我是hello2 this:',this) // undefined
}
hello2()  

// （3）用obj直接调用hello3函数，则第一个this指向obj。
// setTimeOut里面的匿名函数，this指向window。
// setTimeOut里面的箭头函数，this指向obj。
// 因为：箭头函数的this，是在定义箭头函数时根据上下文函数环境决定，该箭头函数定义在函数内部，上下文执行环境在hellow3函数内，所以指向hello3的this

var obj = {
    name:'aaa',
    hello3(){
        console.log('我是hello3 this:',this); // obj
        setTimeout(()=>{
            console.log('我是hello3 里面箭头函数settimeout this:',this); // obj
        },3000)

        setTimeout(function (param) {  
            console.log('我是hello3 里面匿名函数settimeout this:',this); // window
        },2000)
    }
}

obj.hello3()


// （4）hello4是普通函数，直接被obj调用，则this执行obj。hello5是箭头函数，this应该指向上限文函数中的this，这里上下文没有函数对象，所以默认为window
var obj2 = {
    name:'aaa',
    hello4(){
        console.log('我是hello4 this:',this); // obj
    },
    hello5:()=>{
        console.log('我是hello5 this:',this);  // window
    },
}

obj2.hello4();
obj2.hello5();

// （5）使用call 绑定this，取决于call的第一个参数，若第一个参数是null，还是会绑在全局的
function foo(){
    console.log(this)
}

foo(); // global
foo.call(1); // [Number: 1]
foo.call({a:10},1); // { a: 10 }
foo.call(null,1); // global